home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Delphi Programmer's Power Pack
/
Delphi Volume 1.iso
/
s_to_z
/
statone
/
stat.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1996-09-15
|
5KB
|
201 lines
unit Stat;
interface
uses
SysUtils,
WinTypes,
WinProcs,
Messages,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
dynary;
const
STATVERSION = 'Ver 1.10';
MISSING = 5e-324; {not used in this version}
type
TStatResults = record
N, NMissing: LongInt;
Mean, Median, Sum, SS, Variance, Skewness, Kurtosis, StdErr,
StdDev, GeoMean, HarMean, Bisquare, IQR: Double;
end;
StatOne = class(TDoubleArray)
private
{ Private declarations }
FAboutStatOne: string;
FStatResults: TStatResults;
procedure SetAboutStatOne(value: string);
protected
{ Protected declarations }
public
{ Public declarations }
property StatResults: TStatResults read FStatResults;
procedure CalcStat;
procedure Bisquare(const c: integer);
function Percentile(Percent: double): double;
published
{ Published declarations }
constructor Create(AOwner: TComponent); override;
property AboutStat: string read FAboutStatOne write SetAboutStatOne;
end;
procedure Register;
implementation
procedure StatOne.Bisquare(const c: integer);
function MaxAbs(n1, n2: double): double;
begin
if n1 = 0.0 then begin
Result := Abs(n2);
Exit
end else if n2 = 0.0 then begin
Result := Abs(n1);
Exit
end;
if Abs(n1) >= Abs(n2) then
Result := Abs(n1)
else
Result := Abs(n2);
end;
var
b1, b2, s, u, w, wx, weight: double;
i: integer;
begin
CalcStat;
b2 := FStatResults.Mean;
s := c * FStatResults.IQR / 2;
while (Abs(b1 - b2) / MaxAbs(b1, b2)) > 0.01 do begin
b1 := b2; w := 0; wx := 0;
for i := 1 to FStatResults.N do begin
u := (Value[i] - b1) / s;
if abs(u) <= 1 then begin
weight := sqr((1 - sqr(u)));
w := w + weight;
wx := wx + (weight * Value[i])
end;
end;
b2 := wx / w;
end;
FStatResults.Bisquare := b2;
end;
procedure StatOne.CalcStat;
var
i: integer;
N, NGeo: LongInt;
x, ssLn, ssInv, v, m1, m2, m3, m4, Temp: Double;
begin
FStatResults.N := 0;
FStatResults.NMissing := 0;
FStatResults.Sum := 0;
FStatResults.SS := 0.0;
FStatResults.Skewness := 0.0;
FStatResults.Kurtosis := 0.0;
FStatResults.StdErr := 0.0;
ssLn := 0.0; ssInv := 0.0;
v := 0.0; m1 := 0.0; m2 := 0.0; m3 := 0.0; m4 := 0.0; N := 0; NGeo := 0;
Sort;
for i := 1 to Size do begin
if i > MISSING then begin
Inc(N);
v := (Value[i] - m1) / N;
m4 := m4 - (4 * v * m3) + (6 * v * v * m2) + ((N * N) - (3 * (N - 1))) * N * (N -1) * v * v * v * v;
m3 := m3 - (3 * v * m2) + (N * (N - 1) * (N - 2) * v * v * v);
m2 := m2 + (N * (N - 1) * v * v);
m1 := m1 + v;
FStatResults.Sum := FStatResults.Sum + Value[i];
FStatResults.SS := FStatResults.SS + Sqr(Value[i]);
if Value[i] > 0 then
begin
ssInv := ssInv + 1 / Value[i];
ssLn := ssLn + Ln(Value[i]);
Inc(NGeo);
end;
end else
Inc(FStatResults.NMissing);
end;
FStatResults.N := N;
FStatResults.Mean := m1;
if N > 1 then
FStatResults.Variance := m2 / (N - 1)
else
FStatResults.Variance := 0.0;
FStatResults.StdDev := sqrt(FStatResults.Variance);
FStatResults.Sum := m1 * N;
if N > 2 then
FStatResults.Skewness := (N * m3) / ((N - 1) * (N - 2) *(FStatResults.StdDev * FStatResults.StdDev * FStatResults.StdDev))
else
FStatResults.Skewness := 0.0;
if N > 3 then
begin
Temp := (N - 1) * (N - 2);
FStatResults.Kurtosis := ((N * (N + 1)* m4) - (3 * m2 * m2 * (N - 1))) /
(Temp * (N - 3) * FStatResults.StdDev * FStatResults.StdDev *
FStatResults.StdDev * FStatResults.StdDev)
end
else
begin
FStatResults.Kurtosis := 0
end;
FStatResults.StdErr := FStatResults.StdDev / sqrt(N);
FStatResults.GeoMean := Exp(ssLn / NGeo);
FStatResults.HarMean := NGeo / ssInv;
FStatResults.Median := Percentile(50);
FStatResults.IQR := Percentile(75) - Percentile(25);
end;
function StatOne.Percentile(Percent: double): double;
var
x: double;
i, N: LongInt;
begin
if (Percent < 0.0) or (Percent > 100.0) then begin
showmessage('Percent out of range');
exit;
end;
N := FStatResults.N;
Percent := Percent / 100.0;
x := Int(N * Percent);
if x = (N * Percent) then begin
i := Trunc(x);
Result := (Value[i] + Value[i+1]) / 2;
end else begin
i := Round(N * Percent) {+ 1};
Result := Value[i];
end;
end;
constructor StatOne.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FAboutStatOne := STATVERSION;
end;
procedure StatOne.SetAboutStatOne(value: string);
begin
FAboutStatOne := STATVERSION;
end;
procedure Register;
begin
RegisterComponents('Ted', [StatOne]);
end;
end.